package study.service.blog;

import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import study.domain.blog.Friend;
import study.domain.blog.FriendId;
import study.domain.user.User;
import study.repository.blog.FriendRepository;

import com.google.common.collect.Lists;

@Service
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public class FriendService {

	@Resource(name = "friendRepository")
	private FriendRepository friendRepository;

	/**
	 * 사용자의 모든 Following 목록을 반환한다.
	 */
	public List<User> findAllFollowing(User user) {
		return findAllFollowing(user.getUserId());
	}

	/**
	 * 사용자의 모든 Following 목록을 반환한다.
	 *
	 * @param userId 사용자 ID
	 */
	public List<User> findAllFollowing(Long userId) {
		List<Friend> list = friendRepository.findAllById_User_UserId(userId);
		if (list == null) {
			return Collections.emptyList();
		}
		List<User> following = Lists.newArrayList();
		for (Friend friend : list) {
			following.add(friend.getId().getFriend());
		}
		return following;
	}

	/**
	 * 사용자의 모든 Follower 목록을 반환한다.
	 */
	public List<User> findAllFollower(User user) {
		return findAllFollower(user.getUserId());
	}

	/**
	 * 사용자의 모든 Follower 목록을 반환한다.
	 *
	 * @param userId 사용자 ID
	 */
	public List<User> findAllFollower(Long userId) {
		List<Friend> list = friendRepository.findAllById_Friend_UserId(userId);
		if (list == null) {
			return Collections.emptyList();
		}
		List<User> follower = Lists.newArrayList();
		for (Friend friend : list) {
			follower.add(friend.getId().getUser());
		}
		return follower;
	}

	/**
	 * 사용자가 이미 Following 중 인지 여부를 반환한다.
	 *
	 * @param user 사용자
	 * @param friend 친구
	 */
	public boolean existsFollowing(User user, User friend) {
		return friendRepository.exists(new FriendId(user, friend));
	}

	/**
	 * 대상자가 이미 Follower 인지 여부를 반환한다.
	 *
	 * @param user 사용자
	 * @param friend 친구
	 */
	public boolean existsFollower(User user, User friend) {
		return friendRepository.exists(new FriendId(friend, user));
	}

	@Transactional(readOnly = false)
	public Friend add(User user, User friend) {
		return friendRepository.save(new Friend(user, friend));
	}

}
